package com.itany.corejava.code12_线程;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年11月30日 10:39
 */
public class Test15_生产者消费者 {
    public static void main(String[] args) {
        Cook cook=new Cook();
        Foodie foodie=new Foodie();
        cook.setName("厨师");
        foodie.setName("美食家");
        cook.start();
        foodie.start();
    }
}
//缓冲区
class Desk{
    // 作用:控制生产者和消费者的执行

    // 0表示没有面条  1表示有面条
    public static int foodFlag=0;


    //总个数
    public static int count=10;

    //锁对象
    public static Object lock=new Object();
}

/*1.循环
2.同步代码块
3.判断共享数据是否到了末尾
4.3.判断共享数据是否到了末尾(如果没有到末尾，执行核心逻辑)*/
// 消费者
class Foodie extends Thread{
    @Override
    public void run() {
        while(true){
           synchronized (Desk.lock){
               if(Desk.count==0){
                   break;
               }else{
                   //先判断桌子上是否有面条
                   if(Desk.foodFlag==0){
                        //如果没有面条
                       try {
                           Desk.lock.wait();
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }else{
                       Desk.count--;//1   0
                       //如果有面条，就吃
                       System.out.println("美食家在享受美食，还能再享受："+Desk.count+"碗");

                       // 吃完之后，唤醒厨师继续做
                       Desk.lock.notifyAll();

                       //修改桌子的状态
                       Desk.foodFlag=0;
                   }

               }
           }
        }
    }
}
//生产者
class Cook extends Thread{
    @Override
    public void run() {
        while(true){
            synchronized (Desk.lock){
                if(Desk.count==0){
                    break;
                }else{

                    //判断桌子上是否有食物
                    if(Desk.foodFlag==1){
                        //如果有食物，则等待
                        try {
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }else{
                        //没有食物，就做面条
                        System.out.println("厨师做了一碗面条");

                        //修改桌子状态
                        Desk.foodFlag=1;

                        //唤醒等待的消费者开吃
                        Desk.lock.notifyAll();


                    }

                }
            }
        }
    }
}